package com.mvc.demo.config;

import com.mvc.demo.interceptor.MultiInterceptor1;
import com.mvc.demo.interceptor.MultiInterceptor2;
import com.mvc.demo.interceptor.MultiInterceptor3;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author H
 * @date 2023/1/8
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册拦截器到Spring mvc机制，然后会返回一个拦截器注册
        // InterceptorRegistration interceptorRegistration = registry.addInterceptor(new MyInterceptor());
        // 指定拦截匹配方式，限制拦截器拦截请求（**代表多级路径，*代表一级路径）
        // interceptorRegistration.addPathPatterns("/interceptor/**");

        /*
         * 测试多个拦截器的执行顺序（与拦截器的注册顺序有关）
         *  情况：三个拦截器preHandle均返回true
         *      [MultiInterceptor2]处理器前方法
         *      [MultiInterceptor1]处理器前方法
         *      [MultiInterceptor3]处理器前方法
         *      执行处理器逻辑
         *      [MultiInterceptor3]处理器后方法
         *      [MultiInterceptor1]处理器后方法
         *      [MultiInterceptor2]处理器后方法
         *      [MultiInterceptor3]处理器完成方法
         *      [MultiInterceptor1]处理器完成方法
         *      [MultiInterceptor2]处理器完成方法
         *
         * 情况：拦截器3返回false，其它都返回true
         * 处理器前(preHandle)方法会执行，但是一旦返回False，则后续的拦截器、处理器和所有拦截器的后置处理器(postHandle)方法都不会被执行。
         * 完成方法afterCompletion则不一样，它只会执行返回true的拦截器的完成方法，而且顺序是先注册后执行。
         *      [MultiInterceptor2]处理器前方法
         *      [MultiInterceptor1]处理器前方法
         *      [MultiInterceptor3]处理器前方法
         *      [MultiInterceptor1]处理器完成方法
         *      [MultiInterceptor2]处理器完成方法
         */
        InterceptorRegistration interceptorRegistration2 = registry.addInterceptor(new MultiInterceptor2());
        interceptorRegistration2.addPathPatterns("/interceptor/**");
        InterceptorRegistration interceptorRegistration1 = registry.addInterceptor(new MultiInterceptor1());
        interceptorRegistration1.addPathPatterns("/interceptor/**");
        InterceptorRegistration interceptorRegistration3 = registry.addInterceptor(new MultiInterceptor3());
        interceptorRegistration3.addPathPatterns("/interceptor/**");

    }
}
